package com.mjf.scala.chapter07

/**
 * -简化\规约
 *    >通过指定的逻辑将集合中的数据进行聚合，从而减少数据，最终获取结果。
 *    >reduce         函数参数类型和返回值类型必须一致，底层调用的是reduceLeft
 *    >reduceLeft     函数参数类型可以不一致
 *    >reduceRight    函数参数类型可以不一致
 * -折叠
 *    >集合外元素和集合内部元素进行聚合
 *    >fold
 *    >foldLeft
 *    >foldRight
 */
object Scala13_TestFun {
  def main(args: Array[String]): Unit = {

    val list: List[Int] = List(1, 2, 3, 4)

//    list.reduce((a:Int, b:Int) => {a + b})
    println(list.reduce(_ + _)) // 10
    println(list.reduceLeft(_ + _)) // 10
    println(list.reduceRight(_ + _))  // 10

    println(list.reduceLeft(_ - _)) // -8
    println(list.reduceRight(_ - _)) // -2

    val list2: List[Int] = List(3, 4, 5, 8, 10)

    /**
     * reduceRight底层源码：if (tail.isEmpty) head else op(head, tail.reduceRight(op))
     *
     * 3 - （4 - （5 - （8 - 10））） = 3 - （4 - （5 - （-2））） = 3 - （4 - 7） = 6
     */
    println(list2.reduceRight(_ - _)) // 6


    // (z: A1):集合外的参考值，初始值
    println(list2.fold(10)(_ + _)) // 40
    println(list2.foldLeft(10)(_ + _)) // 40
    println(list2.foldRight(11)(_ - _))  // -5

  }
}
